/*
给你一个 m * n 的矩阵，矩阵中的数字 各不相同 。请你按 任意 顺序返回矩阵中的所有幸运数。

幸运数是指矩阵中满足同时下列两个条件的元素：

在同一行的所有元素中最小
在同一列的所有元素中最大
 

示例 1：

输入：matrix = [[3,7,8],[9,11,13],[15,16,17]]
输出：[15]
解释：15 是唯一的幸运数，因为它是其所在行中的最小值，也是所在列中的最大值。
示例 2：

输入：matrix = [[1,10,4,2],[9,3,8,7],[15,16,17,12]]
输出：[12]
解释：12 是唯一的幸运数，因为它是其所在行中的最小值，也是所在列中的最大值。
示例 3：

输入：matrix = [[7,8],[1,2]]
输出：[7]
 

提示：

m == mat.length
n == mat[i].length
1 <= n, m <= 50
1 <= matrix[i][j] <= 10^5
矩阵中的所有元素都是不同的

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/lucky-numbers-in-a-matrix
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/

#include "../stdc++.h"

class Solution {
public:
    vector<int> luckyNumbers (vector<vector<int>>& matrix) {
        if (matrix.empty() || matrix[0].empty()) {
            return {};
        }
        vector<int> res{};
        int m = matrix.size();
        int n = matrix[0].size();

        // 先求出每一列的最大值
        vector<int> colMax(n, INT_MIN);
        for (int j{0}; j < n; ++j) {
            for (int i{0}; i < m; ++i) {
                if (matrix[i][j] > colMax[j]) {
                    colMax[j] = matrix[i][j];
                }
            }
        }

        for (int i{0}; i < m; ++i) {
            int minIndex{0};
            for (int j{1}; j < n; ++j) {
                if (matrix[i][j] < matrix[i][minIndex]) {
                    minIndex = j;
                }
            }
            if (matrix[i][minIndex] == colMax[minIndex]) {
                res.push_back(matrix[i][minIndex]);
            }
        }
        return res;
    }
};

class Solution {
public:
    vector<int> luckyNumbers (vector<vector<int>>& matrix) {
        if (matrix.empty() || matrix[0].empty()) {
            return {};
        }
        vector<int> res{};
        int m = matrix.size();
        int n = matrix[0].size();

        // 预处理出每行的最小，每列的最大
        vector<int> rowMin(m, INT_MAX);
        vector<int> colMax(n, 0);
        for (int i{0}; i < m; ++i) {
            for (int j{0}; j < n; ++j) {
                rowMin[i] = min(rowMin[i], matrix[i][j]);
                colMax[j] = max(colMax[j], matrix[i][j]);
            }
        }

        for (int i{0}; i < m; ++i) {
            for (int j{0}; j < n; ++j) {
                if (matrix[i][j] == rowMin[i] && matrix[i][j] == colMax[j]) {
                    res.push_back(matrix[i][j]);
                }
            }
        }
        return res;
    }
};